/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package org.contabilidad.cierres;

import java.sql.Date;
import javax.swing.JOptionPane;
import org.mybeans.ComerciosBeans;
import org.mybeans.MorosidadMensualBeans;
import org.mybeans.PagosAnualesBeans;
import org.mybeans.PagosMensualesBeans;
import org.mybeans.PorcentajesMorosidadAnualBeans;
import org.mybeans.PorcentajesMorosidadMensualBeans;
import org.mybeans.RecargoMensualBeans;
import org.mybeans.RegimenComerciosBeans;

import org.mybeans.Sesion;

/**
 *
 * @author avbravo
 */
public class CierreMensualContableComercios {

    static int anio;
    static java.sql.Date fecha;
    static String mes;
    static String idusuario;
    static String idmunicipio;
    String idcomercio;
    String comercio;
    String[] arrayMes;
    double porcentajeMorosidadMensual;
    double porcentajeMorosidadAnual;
    double valor;
    Sesion sesion;
    ComerciosBeans comerciosBeans;
    MorosidadMensualBeans morosidadMensualBeans;
    PagosMensualesBeans pagosMensualesBeans;
    PagosAnualesBeans pagosAnualesBeans;
    PorcentajesMorosidadMensualBeans porcentajesMorosidadMensualBeans;
    PorcentajesMorosidadAnualBeans porcentajesMorosidadAnualBeans;
    RecargoMensualBeans recargoMensualBeans;
    RegimenComerciosBeans regimenComerciosBeans;

    public static int getAnio() {
        return anio;
    }

    public static void setAnio(int anio) {
        CierreMensualContableComercios.anio = anio;
    }

    public static Date getFecha() {
        return fecha;
    }

    public static void setFecha(Date fecha) {
        CierreMensualContableComercios.fecha = fecha;
    }

    public static String getIdmunicipio() {
        return idmunicipio;
    }

    public static void setIdmunicipio(String idmunicipio) {
        CierreMensualContableComercios.idmunicipio = idmunicipio;
    }

    public static String getIdusuario() {
        return idusuario;
    }

    public static void setIdusuario(String idusuario) {
        CierreMensualContableComercios.idusuario = idusuario;
    }

    public static String getMes() {
        return mes;
    }

    public static void setMes(String mes) {
        CierreMensualContableComercios.mes = mes;
    }

    public CierreMensualContableComercios() {

        comerciosBeans = new ComerciosBeans();

        morosidadMensualBeans = new MorosidadMensualBeans();
        pagosAnualesBeans = new PagosAnualesBeans();
        pagosMensualesBeans = new PagosMensualesBeans();
        porcentajesMorosidadMensualBeans = new PorcentajesMorosidadMensualBeans();
        porcentajesMorosidadAnualBeans = new PorcentajesMorosidadAnualBeans();
        recargoMensualBeans = new RecargoMensualBeans();
        regimenComerciosBeans = new RegimenComerciosBeans();
        sesion = new Sesion();
        arrayMes = sesion.getArrayMeses();
        cargarPorcentajeMorosidadAnual();
        cargarPorcentajeMorosidadMensual();
    }

    public boolean IniciarCierre() {
        try {
            //
            Comercios();
       

            return true;
        } catch (Exception ex) {
            JOptionPane.showMessageDialog(null, "CierreMensualContableComercios.java\nIniciarCierre()\nError " + ex.getMessage(), "Error", JOptionPane.ERROR_MESSAGE);
        }
        return false;
    }

    private void Comercios() {
        try {

            String sql;

            regimenComerciosBeans.setAnio(this.anio);
              sql = " select comercios.*, corregimients.corregimiento "
                    + " from comercios, corregimients "
                    + " where comercios.idmunicipio = '" + sesion.getIdmunicipio() + "' and comercios.activo='si'"
                    + " and comercios.IDCORREGIMIENTO = corregimients.idcorregimiento ";
            if (comerciosBeans.CargarListadoComercios(sql) == false) {
                //no existen comercios para procesar en este municipio
                return;
            }

            if (comerciosBeans.getNumeroRegistrosLista() == - 1) {
                //   System.out.println("No tiene registros de comercios");
                return;
            }



            for (int i = 0; i <= comerciosBeans.getNumeroRegistrosLista(); i++) {
                this.idcomercio = comerciosBeans.getListaIdComercio().get(i);
                comercio = comerciosBeans.getListaComercio().get(i);
                regimenComerciosBeans.CargarImpuestosPorComercio(this.idcomercio);
                /*
                 * verifica si tiene impuestos
                 */
                if (regimenComerciosBeans.getNumeroRegistrosLista() == - 1) {
                    // No tiene impuestos
                } else {
                    VerificarMorosidadImpuestosComercios();
                }
            }


        } catch (Exception ex) {
            JOptionPane.showMessageDialog(null, "CierreMensualContableComercios.java\nComercios()\nError " + ex.getMessage(), "Error", JOptionPane.ERROR_MESSAGE);
        }
    }

    private void VerificarMorosidadImpuestosComercios() {
        try {
            for (int j = 0; j <= regimenComerciosBeans.getNumeroRegistrosLista(); j++) {
                regimenComerciosBeans.setIdComercio(this.idcomercio);

                regimenComerciosBeans.setIdRegimen(regimenComerciosBeans.getListaIdRegimen().get(j));
                String sValor = regimenComerciosBeans.getListaValor().get(j);
                 this.valor = 0;
                if (sValor == null || sValor.equals("")) {
                    this.valor = 0;
                } else {
                    this.valor = Double.parseDouble(sValor);
                }
                regimenComerciosBeans.setValor(this.valor);

                /*
                 *verificar el periodo de pago para crear los impuestos necesarios
                 */

                String periodopago = regimenComerciosBeans.getListaPeriodoPago().get(j);
                periodopago = periodopago.toLowerCase();
                if (periodopago.equals("mensual")) {

                    VerificarPagoMensual();

                } else {
                    /*
                     * es un impuesto de pago anual
                     */
                   VerificarPagoAnual();
                }
            }
        } catch (Exception ex) {
            JOptionPane.showMessageDialog(null, "CierreMensualContableComercios.java\nVerificarMorosidadImpuestosComercios()\nError " + ex.getMessage(), "Error", JOptionPane.ERROR_MESSAGE);
        }
    }

    private void cargarPorcentajeMorosidadMensual() {
        try {
            if (porcentajesMorosidadMensualBeans.Consultar() == true) {
                this.porcentajeMorosidadMensual = porcentajesMorosidadMensualBeans.getPorcentaje();

            } else {
                JOptionPane.showMessageDialog(null, " No se han asignado porcentajes de Morosidad MEnsual", "Mensajes", JOptionPane.ERROR_MESSAGE);
                return;
            }
        } catch (Exception ex) {
            JOptionPane.showMessageDialog(null, "CierreMensualContableComercios.java\ncargarPorcentajeMorosidadMensual()\nError " + ex.getMessage(), "Error", JOptionPane.ERROR_MESSAGE);

        }
    }

    private void cargarPorcentajeMorosidadAnual() {
        try {
            if (porcentajesMorosidadAnualBeans.Consultar() == true) {
                this.porcentajeMorosidadAnual = porcentajesMorosidadAnualBeans.getPorcentaje();

            } else {
                JOptionPane.showMessageDialog(null, " No se han asignado porcentajes de Morosidad Anual", "Mensajes", JOptionPane.ERROR_MESSAGE);
                return;
            }
        } catch (Exception ex) {
            JOptionPane.showMessageDialog(null, "CierreMensualContableComercios.java\ncargarPorcentajeMorosidadAnual()\nError " + ex.getMessage(), "Error", JOptionPane.ERROR_MESSAGE);

        }
    }

    private void VerificarPagoMensual() {
        try {

            /*
             * verificar si pago ese mes.
             */
            pagosMensualesBeans.setId(this.idcomercio);
            pagosMensualesBeans.setTipoId("comercios");
            pagosMensualesBeans.setIdMunicipio(sesion.getIdmunicipio());
            pagosMensualesBeans.setAnio(this.anio);
            pagosMensualesBeans.setMes(this.mes);
            pagosMensualesBeans.setIdRegimen(regimenComerciosBeans.getIdRegimen());
            /*
             *verificamos si pago ese mes
             */
            if (pagosMensualesBeans.VerificarNoPagoMensual() == true) {
                /*
                 *quiere decir que no pago el mes
                 * verificar si tenia morosidad anterior
                 */
                CalcularMorosidadMensual();

                CalcularRecargoMensual();



            } else {
                //pago el mes, no esta moroso en ese mes.
            }

        } catch (Exception ex) {
            JOptionPane.showMessageDialog(null, "CierreMensualContableComercios.java\nVerificarPagoMensual()\nError: " + ex.getMessage(), "Error", JOptionPane.ERROR_MESSAGE);
        }
    }



    private void CalcularMorosidadMensual() {
        try {
            morosidadMensualBeans.setId(this.idcomercio);
            morosidadMensualBeans.setTipoId("comercios");
            morosidadMensualBeans.setIdMunicipio(sesion.getIdmunicipio());
            morosidadMensualBeans.setAnio(this.anio);
            morosidadMensualBeans.setMes(this.mes);
            morosidadMensualBeans.setUltimoMes(this.mes);
            morosidadMensualBeans.setIdRegimen(regimenComerciosBeans.getIdRegimen());

            int nmes;
            double saldo;
            if (morosidadMensualBeans.VerificarMorosidadMensual() == true) {

                //tiene morosidad anterior
                //actualizo el numero de mes , sumandole uno. Es decir contando el mes actual.
                nmes = morosidadMensualBeans.getNumeroMes() + 1;
                //sumo el saldo anterior mas el saldo del mes que paso y que no pago
                saldo = morosidadMensualBeans.getSaldoActual() + regimenComerciosBeans.getValor();
                morosidadMensualBeans.setNumeroMes(nmes);
                morosidadMensualBeans.setSaldoActual(saldo);
                morosidadMensualBeans.setUltimoMes(this.mes);
                morosidadMensualBeans.Actualizar();
                //guardamos el cierre
                morosidadMensualBeans.AgregarCierre();

                /*
                 *verifica si tenia recargo anterior, y lo actualiza
                 * o si no tenia crea uno nuevo.
                 */
            } else {
                //no tiene ningun registro de morosidad anterior, este sera el primero
                //es el primer mes moroso, y el saldo sera igual al valor del impuesto.

                nmes = 1;
                //sumo el saldo anterior mas el saldo del mes que paso y que no pago
                saldo = regimenComerciosBeans.getValor();
                morosidadMensualBeans.setNumeroMes(nmes);
                morosidadMensualBeans.setSaldoActual(saldo);
                morosidadMensualBeans.setUltimoMes(this.mes);
                //agregamos la morosidad
                morosidadMensualBeans.Agregar();
                //guardamos el cierre
                morosidadMensualBeans.AgregarCierre();
            }
            /*
             *
             * fin del proceso de la morosidad mensual
             */

        } catch (Exception ex) {
            JOptionPane.showMessageDialog(null, "CierreMensualContableComercios.java\nCalcularMorosidadMensual()\nError " + ex.getMessage(), "Error", JOptionPane.ERROR_MESSAGE);
        }
    }

    private void CalcularRecargoMensual() {
        try {
            /*
             *Procesar el recargo mensual
             */
            recargoMensualBeans.setId(this.idcomercio);
            recargoMensualBeans.setTipoId("comercios");
            recargoMensualBeans.setIdMunicipio(sesion.getIdmunicipio());
            recargoMensualBeans.setAnio(this.anio);
            recargoMensualBeans.setMes(this.mes);
            recargoMensualBeans.setIdRegimen(regimenComerciosBeans.getIdRegimen());

            double nporcentaje = 0;

            double recargoactual;
            if (recargoMensualBeans.VerificarRecargoMensual() == true) {
                //tiene recargo anterior
                //actualizo el numero de mes , sumandole uno. Es decir contando el mes actual.

                nporcentaje = recargoMensualBeans.getNumeroPorcentaje() + 1;
                //sumo el recargo  anterior mas el saldo del mes que paso y que no pago
                recargoactual = recargoMensualBeans.getRecargoActual() + (regimenComerciosBeans.getValor() * (nporcentaje / 100));
                recargoMensualBeans.setNumeroPorcentaje(nporcentaje);
                recargoMensualBeans.setRecargoActual(recargoactual);
                recargoMensualBeans.Actualizar();
                //guardamos el cierre
                recargoMensualBeans.AgregarCierre();

                /*
                 *verifica si tenia recargo anterior, y lo actualiza
                 * o si no tenia crea uno nuevo.
                 */


            } else {
                //no tiene ningun registro de recargo anterior, este sera el primero
                //es el primer mes con recargo, y el recargo se debe calcular.

                nporcentaje = this.porcentajeMorosidadMensual;
                recargoactual = regimenComerciosBeans.getValor() * (nporcentaje / 100);
                recargoMensualBeans.setNumeroPorcentaje(nporcentaje);
                recargoMensualBeans.setRecargoActual(recargoactual);

                //agregamos la morosidad
                recargoMensualBeans.Agregar();
                //guardamos el cierre
                recargoMensualBeans.AgregarCierre();


            }
            /*
             *fin proceso recargo mensual
             */
        } catch (Exception ex) {
            JOptionPane.showMessageDialog(null, "CierreMensualContableComercios.java\nCalcularRecargoMensual()\nError " + ex.getMessage(), "Error", JOptionPane.ERROR_MESSAGE);
        }
    }

        private void VerificarPagoAnual() {
        try {


            pagosAnualesBeans.setId(this.idcomercio);
            pagosAnualesBeans.setTipoId("comercios");
            pagosAnualesBeans.setIdMunicipio(sesion.getIdmunicipio());
            pagosAnualesBeans.setAnio(this.anio);
            pagosAnualesBeans.setMes(this.mes);
            pagosAnualesBeans.setIdRegimen(regimenComerciosBeans.getIdRegimen());
            /*
             *verificamos que no ha pagado el mes en que le tocaba o el mes anterior
             * como es anual, debemos mostrar en el cierre mensual esa morosidad y el recargo del cierre
             * si ya se le proceso el recargo, este solo sera una vez el del cierre si
             * se mostrara siempre para que la información se muestre actualizada siempre.
            */
            if (pagosAnualesBeans.VerificarNoPagoAnualCierreMensual() == true){
                //guardar el cierre
                pagosAnualesBeans.setMorosidad(this.valor);
                //guardamos el cierre mensual
                 pagosAnualesBeans.AgregarCierre();
                    CalcularRecargoAnual();
            }
           // if (pagosAnualesBeans.VerificarNoPagoAnualEsteMes() == true) {
            
             
          //  } else {
                //pago el mes, no esta moroso en ese mes.
          //  }

        } catch (Exception ex) {
            JOptionPane.showMessageDialog(null, "CierreMensualContableComercios.java\nControlarPagoAnual()\nError " + ex.getMessage(), "Error", JOptionPane.ERROR_MESSAGE);

        }
    }

            private void CalcularRecargoAnual() {
        try {
            /*
             *Procesar el recargo mensual
             */
            recargoMensualBeans.setId(this.idcomercio);
            recargoMensualBeans.setTipoId("comercios");
            recargoMensualBeans.setIdMunicipio(sesion.getIdmunicipio());
            recargoMensualBeans.setAnio(this.anio);
            recargoMensualBeans.setMes(this.mes);
            recargoMensualBeans.setIdRegimen(regimenComerciosBeans.getIdRegimen());

            double nporcentaje = 0;

            double recargoactual;

                nporcentaje = this.porcentajeMorosidadAnual;
                recargoactual = regimenComerciosBeans.getValor() * (nporcentaje / 100);
            
                recargoMensualBeans.setNumeroPorcentaje(nporcentaje);
                recargoMensualBeans.setRecargoActual(recargoactual);
                recargoMensualBeans.AgregarCierre();

            if (recargoMensualBeans.VerificarRecargoMensual() == false) {
           
                recargoMensualBeans.setNumeroPorcentaje(nporcentaje);
                recargoMensualBeans.setRecargoActual(recargoactual);
                recargoMensualBeans.Agregar();
            }
            /*
             *fin proceso recargo mensual
             */
        } catch (Exception ex) {
            JOptionPane.showMessageDialog(null, "CierreMensualContableComercios.java\nCalcularRecargoMensual()\nError " + ex.getMessage(), "Error", JOptionPane.ERROR_MESSAGE);
        }
    }
} //class

